/*
 * Slide.c
 *
 *  Created on: May 15, 2021
 *      Author: soliber
 *      说明：	滑台控制API
 *      		滑台顶端为零点，向下运动为正方向
 */

#include "slide.h"


/*----------------------私有宏定义---------------------*/
//滑台参数
#define		STEP_ANGLE_ORIGIN	18								//电机原始步距角(°/step）
#define		SUBDIVIDED			16								//电机驱动器细分,分频系数
#define		STEP_ANGLE			(STEP_ANGLE_ORIGIN/SUBDIVIDED)	//细分后的步距角（°/step）
#define 	PITCH				3								//丝杆螺距（mm）
#define		TRAVEL				50								//滑台行程（mm）
#define		PPR					(360/STEP_ANGLE)				//电机单圈脉冲数（step）
#define		STEP_LENGTH			(STEP_ANGLE/360*PITCH)			//滑台步长（mm）
#define		TRAVEL_STEP			(TRAVEL/STEP_LENGTH)			//滑台行程（step）


/*----------------------私有变量-----------------------*/
static uint32_t	step[3];		//记录相对零点的步进计数，范围应限定在0~(TRAVEL_STEP-1)
static enum{UP=0,DOWN=1} dir;	//记录方向
/*----------------------私有函数声明-------------------*/





/*----------------------API实现------------------------*/

/*
 * 函数名：	HAL_Slide_Init
 *
 * 说明：	初始化滑台
 * 			将所有滑台移动到最顶端，并将该位置设为零点
 * 			若一定时间内仍未找到零点，则认为超时
 *
 * 参数：	timeout，超时时间，单位ms
 *
 * 返回值：	HAL_OK：初始化成功
 * 			HAL_TIMEOUT：初始化超时
 * 			其他：初始化失败
 */
HAL_StatusTypeDef HAL_Slide_Init(uint32_t timeout)
{
	/*
	 * 伪代码
	 *
	 * if(至少有一个滑台不在零点）
	 * {
	 *		在零点的滑台step[n] = 0;
	 * 		不在零点的滑台开始向上移动
	 * 		time = 当前时间
	 * 		while(当前时间<time+timeout)
	 * 		{
	 * 			if(某个滑台i到达了限位)
	 * 			{
	 * 				停止该滑台
	 * 				step[i] = 0;
	 * 				if(三个滑台全部停止）
	 * 				{
	 * 					return HAL_OK;
	 * 				}
	 * 			}
	 * 		}
	 * 		运行到这里说明规定的时间内未能到达零点，超时
	 * 		return HAL_TIMEOUT;
	 * }
	 *
	 * 否则说明已经到达零点，直接设置零点即可
	 * step[0] = 0;
	 * step[1] = 0;
	 * step[2] = 0;
	 * return HAL_OK;
	 *
	 */
}

/*
 * 函数名：	HAL_Slide_GetPos
 * 说明：	查询滑台当前位置
 *
 * 参数：	ch，本次要查询的通道
 * 			取值可以为CH1、CH2、CH3
 *
 *
 * 返回值：	该通道的当前位置，单位mm
 */
float HAL_Slide_GetPos(uint8_t ch)
{
	/*
	 * 伪代码
	 *
	 * 将ch转换为序号i
	 *
	 * return step[i]*STEP_LENGTH;	//step换算成mm
	 */
}

/*
 * 函数名：	HAL_Slide_SetPos_Sync
 * 说明：	同步控制一个或多个滑台移动到指定位置
 *
 * 参数1：	ch，本次要移动的通道
 * 			取值可以为CH1、CH2、CH3，也可以为它们的和
 *
 * 参数2：	pos，希望移动到的位置（相对零点，向下移动为正），单位mm
 * 			取值范围为0~TRAVEL_STEP
 *
 * 返回值：	实际移动到的位置，单位mm
 */
float HAL_Slide_SetPos_Sync(uint8_t ch, float pos)
{

	/*
	 * 伪代码
	 *
	 * 分别计算每个滑台要到达的目标位置(step)
	 *
	 * 开始移动需要移动的滑台
	 *
	 * while(1)
	 * {
	 * 		if(某个滑台已经移动到位)
	 * 		{
	 * 				停止该滑台
	 * 		}
	 *
	 * 		if(所有滑台都已到位）
	 * 		{
	 * 				return 滑台的实际位置
	 * 		}
	 * }
	 *
	 */
}


/*----------------------私有函数实现-------------------*/



